# -*- coding: utf-8 -*-
# setting sts font utf-8

import os, sys
from PyPDF3 import PdfFileWriter, PdfFileReader

from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.platypus import BaseDocTemplate, Frame, PageTemplate, Paragraph
from reportlab.platypus.tableofcontents import TableOfContents
from reportlab.platypus import PageBreak
from reportlab.lib.pagesizes import A4

pdfmetrics.registerFont(TTFont('STSONG', './STSONG.TTF')) #register Font
pdfmetrics.registerFont(TTFont('simhei', './simhei.ttf')) #register Font
styles = getSampleStyleSheet()
styles.add(ParagraphStyle(fontName='STSONG', name='STSONG', leading=20, fontSize=12, firstLineIndent=22, wordWrap='CJK'))
styles.add(ParagraphStyle(fontName='simhei', name='simhei', leading=25, fontSize=14, wordWrap='CJK')) # content Font

class MyDocTemplate(BaseDocTemplate):
    def __init__(self, filename, **kw):
        self.allowSplitting = 0
        BaseDocTemplate.__init__(self, filename, **kw)

"""
PDF文件操作类
"""
class PDFClient():

    #获取文件
    def get_reader(self, filename, password):
        try:
            old_file = open(filename, 'rb')
            print('run  jiemi1')
        except Exception as err:
            print('文件打开失败！' + str(err))
            return None

        # 创建读实例
        pdf_reader = PdfFileReader(old_file, strict=False)

        # 解密操作
        if pdf_reader.isEncrypted:
            if password is None:
                print('%s文件被加密，需要密码！' % filename)
                return None
            else:
                if pdf_reader.decrypt(password) != 1:
                    print('%s密码不正确！' % filename)
                    return None
        if old_file in locals():
            old_file.close()
        return pdf_reader

    #打开加密文档
    def decrypt_pdf(self, filename, password, decrypted_filename=None):
        """
        将加密的文件及逆行解密，并生成一个无需密码pdf文件
        :param filename: 原先加密的pdf文件
        :param password: 对应的密码
        :param decrypted_filename: 解密之后的文件名
        :return:
        """
        # 生成一个Reader和Writer
        print('run  jiemi')
        pdf_reader = self.get_reader(filename, password)
        if pdf_reader is None:
            return
        if not pdf_reader.isEncrypted:
            print('文件没有被加密，无需操作！')
            return
        pdf_writer = PdfFileWriter()

        pdf_writer.appendPagesFromReader(pdf_reader)

        if decrypted_filename is None:
            decrypted_filename = "".join(filename[:-4]) + '_' + 'decrypted' + '.pdf'

        # 写入新文件
        pdf_writer.write(open(decrypted_filename, 'wb'))

    def read_pdf(self):
        readFile = './input.pdf'
        # 获取 PdfFileReader 对象
        pdfFileReader = PdfFileReader(readFile)
        # 或者这个方式：pdfFileReader = PdfFileReader(open(readFile, 'rb'))
        # 获取 PDF 文件的文档信息
        documentInfo = pdfFileReader.getDocumentInfo()
        print('documentInfo = %s' % documentInfo)
        # 获取页面布局
        pageLayout = pdfFileReader.getPageLayout()
        print('pageLayout = %s ' % pageLayout)

        # 获取页模式
        pageMode = pdfFileReader.getPageMode()
        print('pageMode = %s' % pageMode)

        xmpMetadata = pdfFileReader.getXmpMetadata()
        print('xmpMetadata  = %s ' % xmpMetadata)

        # 获取 pdf 文件页数
        pageCount = pdfFileReader.getNumPages()

        print('pageCount = %s' % pageCount)
        for index in range(0, pageCount):
            # 返回指定页编号的 pageObject
            pageObj = pdfFileReader.getPage(index)
            print('index = %d , pageObj = %s' % (index, type(pageObj)))
            # <class 'PyPDF2.pdf.PageObject'>
            # 获取 pageObject 在 PDF 文档中处于的页码
            pageNumber = pdfFileReader.getPageNumber(pageObj)
            print('pageNumber = %s ' % pageNumber)

    #PDF加密
    def add_encryption(self, input_pdf, output_pdf, password):
        pdf_writer = PdfFileWriter()
        pdf_reader = PdfFileReader(input_pdf)

        for page in range(pdf_reader.getNumPages()):
            pdf_writer.addPage(pdf_reader.getPage(page))

        pdf_writer.encrypt(user_pwd=password, owner_pwd=None,
                           use_128bit=True)

        with open(output_pdf, 'wb') as fh:
            pdf_writer.write(fh)


    #PDF写入操作
    def addBlankpage(self):
        readFile = './01.pdf'
        outFile = './01_new.pdf'
        pdfFileWriter = PdfFileWriter()

        # 获取 PdfFileReader 对象
        pdfFileReader = PdfFileReader(readFile)  # 或者这个方式：pdfFileReader = PdfFileReader(open(readFile, 'rb'))
        numPages = pdfFileReader.getNumPages()

        for index in range(0, numPages):
            pageObj = pdfFileReader.getPage(index)
            pdfFileWriter.addPage(pageObj)  # 根据每页返回的 PageObject,写入到文件
            pdfFileWriter.write(open(outFile, 'wb'))

        page = pdfFileWriter.addBlankPage()   # 在文件的最后一页写入一个空白页,保存至文件中
        pdfFileWriter.write(open(outFile,'wb'))


    #分割PDF文档
    def splitPdf(self):
        readFile = './input.pdf'
        outFile = './output.pdf'
        pdfFileWriter = PdfFileWriter()

        # 获取 PdfFileReader 对象
        pdfFileReader = PdfFileReader(readFile)
        # 或者这个方式：pdfFileReader = PdfFileReader(open(readFile, 'rb'))
        # 文档总页数
        numPages = pdfFileReader.getNumPages()
        N = 5 # 第N页
        if numPages > N:
            # 从第N页之后的页面，输出到一个新的文件中，即分割文档
            for index in range(N, numPages):
                pageObj = pdfFileReader.getPage(index)
                pdfFileWriter.addPage(pageObj)
            # 添加完每页，再一起保存至文件中
            pdfFileWriter.write(open(outFile, 'wb'))

    #合并PDF文档
    def mergePdf(self, inFileList, outFile):
        '''
        合并文档
        :param inFileList: 要合并的文档的 list
        :param outFile:    合并后的输出文件
        :return:
        '''
        pdfFileWriter = PdfFileWriter()
        for inFile in inFileList:
            # 依次循环打开要合并文件
            pdfReader = PdfFileReader(open(inFile, 'rb'))
            numPages = pdfReader.getNumPages()
            for index in range(0, numPages):
                pageObj = pdfReader.getPage(index)
                pdfFileWriter.addPage(pageObj)

            # 最后,统一写入到输出文件中
            pdfFileWriter.write(open(outFile, 'wb'))

    #粗略读取PDF内容
    def getPdfContent(self, filename):
        pdf = PdfFileReader(open(filename, "rb"))
        content = ""
        for i in range(0, pdf.getNumPages()):
            pageObj = pdf.getPage(i)

            extractedText = pageObj.extractText()
            content += extractedText + "\n"
            # return content.encode("ascii", "ignore")
        return content

    # Page Number
    def footer(self, canvas, doc):
        page_num = canvas.getPageNumber()
        canvas.saveState()
        P = Paragraph("%d" % page_num , styles['Normal'])
        w, h = P.wrap(doc.width, doc.bottomMargin)
        P.drawOn(canvas, doc.leftMargin + w/2, h)
        canvas.restoreState()

    def writePDF(self, content, file_name) :
        try :
            PDF = MyDocTemplate(file_name, pagesize=A4)
            frame = Frame(PDF.leftMargin, PDF.bottomMargin, PDF.width, PDF.height, id='normal')
            template = PageTemplate(frames=frame, onPage=self.footer)
            PDF.addPageTemplates([template])

            data = []

            # table of contents
            toc = TableOfContents()
            # setting contents fontName and fontSize
            toc.levelStyles = [
                ParagraphStyle(fontName='simhei', fontSize=20, name='TOCHeading1', leftIndent=20, firstLineIndent=-20, spaceBefore=10, leading=16),
                ParagraphStyle(fontName='simhei', fontSize=18, name='TOCHeading2', leftIndent=40, firstLineIndent=-20, spaceBefore=5, leading=12),
            ]
            data.append(toc) # add contents
            data.append(PageBreak()) #next page

            # add txt

            data.append(Paragraph(content, styles['STSONG']))

            print('Build pdf!')
            PDF.multiBuild(data)
            print("###Sucessful to write" + " " + file_name)
        except Exception as e:
            print(file_name, e)

    def writeFile(self, content, file_name) :
        try :
            with open(file_name,"w") as f:
                f.write(content)
            print("###Sucessful to write" + " " + file_name)
        except Exception as e:
            print(content, file_name, e)

if __name__ == '__main__':
    #记录执行开始时间
    obj = PDFClient()
    content = '''北京城建投资发展股份有限公司关于竞得北京市朝阳区崔各庄乡黑桥村、南皋村棚户区改造项目30-L04地块R2二类居住用地国有建设用地使用权的公告
2021-05-12
本公司董事会及全体董事保证本公告内容不存在任何虚假记载、误导性陈述或者重大遗漏，并对其内容的真实性、准确性和完整性承担个别及连带责任。

2021年4月28日，北京城建投资发展股份有限公司（以下简称“公司”）第七届董事会第五十一次会议在公司四楼会议室召开。会议审议通过了关于公司参与2021年度第一批商品住宅国有建设用地使用权竞买的议案。同意公司联合其他合作伙伴参加上述国有建设用地使用权竞买活动。

由于上述事项存在不确定性，根据上海证券交易所制定的《上市公司信息披露暂缓与豁免业务指引》及《北京城建投资发展股份有限公司信息披露暂缓与豁免业务管理制度》，公司暂缓披露了上述事项。

2021年5月10日公司收到《北京市国有建设用地使用权挂牌出让成交确认书》（京土整储挂函（朝）[2021]008号），公司与招商局地产（北京）有限公司组成的联合体以422,000万元的价格竞得北京市朝阳区崔各庄乡黑桥村、南皋村棚户区改造项目30-L04地块R2二类居住用地（配建“公共租赁住房”）国有建设用地使用权，公司与招商局地产（北京）有限公司的投资比例为50%：50%。

项目位于北京市朝阳区崔各庄乡，30-L04地块用地性质为R2二类居住用地，总建设用地规模约3.41万平方米，规划地上建筑规模约8.53万平方米，配建“公共租赁住房”面积2.86万平方米。

特此公告。


北京城建投资发展股份有限公司董事会

2021年5月12日'''

    '''
    obj.decrypt_pdf(r'test.pdf', '') # 密码不知道，就设置为空
    obj.add_encryption(input_pdf='input.pdf', # 要加密的文件
                   output_pdf='output.pdf', # 加密后要输出的文件
                   password='xxxxx') # 密码
    '''
    filename = 'test.pdf'
    filename = filename.encode('GBK').decode('UTF-8', 'strict')
    obj.writePDF(content, filename)

    